package playerdef

import (
	"fmt"
	"time"
	"wanyu/server/protogo/attrinfo"
)

//interface{} ----> *attrinfo.AttrInfo
func AttrCode(attrvalue interface{}) (*attrinfo.AttrInfo, error) {

	attrInfo := new(attrinfo.AttrInfo)

	switch attrvalue.(type) {
	case int32:
		attrInfo.AttrType = 1
		attrInfo.AttrValue = &attrinfo.AttrInfo_ValueInt32{
			ValueInt32: attrvalue.(int32),
		}
	case int64:
		attrInfo.AttrType = 2
		attrInfo.AttrValue = &attrinfo.AttrInfo_ValueInt64{
			ValueInt64: attrvalue.(int64),
		}
	case string:
		attrInfo.AttrType = 3
		attrInfo.AttrValue = &attrinfo.AttrInfo_ValueString{
			ValueString: attrvalue.(string),
		}
	case float32:
		attrInfo.AttrType = 4
		attrInfo.AttrValue = &attrinfo.AttrInfo_ValueFloat32{
			ValueFloat32: attrvalue.(float32),
		}
	case bool:
		attrInfo.AttrType = 5
		attrInfo.AttrValue = &attrinfo.AttrInfo_ValueBool{
			ValueBool: attrvalue.(bool),
		}
	case time.Time:
		theTime := attrvalue.(time.Time)
		attrInfo.AttrType = 6
		attrInfo.AttrValue = &attrinfo.AttrInfo_ValueInt64{
			ValueInt64: theTime.Unix(),
		}
	case float64:
		attrInfo.AttrType = 7
		attrInfo.AttrValue = &attrinfo.AttrInfo_ValueFloat64{
			ValueFloat64: attrvalue.(float64),
		}
	default:
		return nil, fmt.Errorf("attrvalue.(type) error")
	}

	return attrInfo, nil
}

//*attrinfo.AttrInfo ----> interface{}
func AttrDeCode(attrinfo *attrinfo.AttrInfo) (interface{}, error) {

	if attrinfo == nil {
		return nil, fmt.Errorf("param error")
	}
	switch attrinfo.AttrType {
	case 1:
		return attrinfo.GetValueInt32(), nil
	case 2:
		return attrinfo.GetValueInt64(), nil
	case 3:
		return attrinfo.GetValueString(), nil
	case 4:
		return attrinfo.GetValueFloat32(), nil
	case 5:
		return attrinfo.GetValueBool(), nil
	case 6:
		return time.Unix(attrinfo.GetValueInt64(), 0), nil
	case 7:
		return attrinfo.GetValueFloat64(), nil
	default:
		return nil, fmt.Errorf("attrinfo.Type error")
	}
}
